package com.zyf.chapter02.behavior.visitor.v3;

import java.util.ArrayList;
import java.util.List;

/**
 * 需求：现在有三种格式的文件：PDF、PPT、Word，需要开发一个工具来处理这批资源文件。<br/>
 * 功能点：把资源中的文本内容抽取出来放到 txt 文件中。
 * 现在不仅要能抽取文本内容，还要支持压缩、提取文件元信息 <br/>
 * 目前存在的问题：添加一个业务，还需要修改每个资源文件类
 * 违反了开闭原则
 * @author yifeng
 */
public class ToolApplication {
    public static void main(String[] args) {
        List<ResourceFile> resourceFiles = listAllResourceFiles(args[0]);
        Extractor extractor = new Extractor();
        Compressor compressor = new Compressor();
        for (ResourceFile resourceFile : resourceFiles) {
            // 这行代码会报错
            /**
             * 重载是一种静态绑定，在编译时并不能获取对象的实际类型，而是
             * 根据声明类型执行声明类型对应的方法。
             * 方案请看 v3 版本
             */
            resourceFile.accept(extractor);
            resourceFile.accept(compressor);
        }
    }

    private static List<ResourceFile> listAllResourceFiles(String resourceDirectory) {
        ArrayList<ResourceFile> resourceFiles = new ArrayList<>();
        // ... 根据后缀（pdf/ppt/word）由工厂方法创建不同的类对象（PdfFile/PPTFile/WordFile）
        resourceFiles.add(new PDFFile("a.pdf"));
        resourceFiles.add(new WordFile("a.word"));
        resourceFiles.add(new PPTFile("a.ppt"));
        return resourceFiles;
    }
}
